import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
import statsmodels.api as sm


plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

df = pd.read_excel('attachment2_data.csv', sheet_name='Sheet1')

# 列名标准化（中英文兼容）
column_map = {
    'temperature(℃)': 'temperature',
    'humidity': 'humidity',
    'solid content': 'solid content',
    'proportion of hole area': 'hole_area'
}
df.rename(columns=column_map, inplace=True)

# 处理缺失值（删除含NaN的行）
df.dropna(subset=['temperature', 'humidity', 'solid content', 'hole_area'], inplace=True)

# 转换数据类型
df = df.astype({
    'temperature': 'float',
    'humidity': 'float',
    'solid content': 'float',
    'hole_area': 'float'
})

# 转换为NumPy数组（保留原始顺序）
df = df[['temperature', 'humidity', 'solid content', 'hole_area']]

# 基础检查
print("数据预览:")
print(df)
print("\n数据统计描述:")
print(df.describe())
print("\n缺失值统计:")
print(df.isnull().sum())

# 处理缺失值 (按需修改策略)
df = df.dropna()  # 或使用填充 df.fillna(method='ffill')

# 2. 相关性分析
plt.figure(figsize=(10, 8))
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title("变量相关性热力图")
plt.tight_layout()
plt.savefig('correlation_heatmap.png')  # 保存图片
plt.show()

# 3. 多元线性回归分析 (使用statsmodels获取统计指标)
X = df[['temperature', 'humidity', 'solid content']]
y = df['hole_area']

# 添加常数项 (截距)
X_sm = sm.add_constant(X)
model = sm.OLS(y, X_sm).fit()

print("\n" + "=" * 50)
print("多元线性回归分析结果:")
print(model.summary())

# 4. 随机森林特征重要性分析
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_scaled, y)

# 可视化特征重要性
features = X.columns
importances = rf.feature_importances_
sorted_idx = np.argsort(importances)
print(f"随机森林特征数值：{importances[sorted_idx]}")
plt.figure(figsize=(10, 6))
plt.barh(range(len(sorted_idx)), importances[sorted_idx], align='center')
plt.yticks(range(len(sorted_idx)), features[sorted_idx])
plt.xlabel("特征重要性")
plt.title("随机森林特征重要性排序")
plt.tight_layout()
plt.savefig('feature_importance.png')  # 保存图片
plt.show()

# 5. 结果解读建议
print("\n" + "=" * 50)
print("分析结果解读指南:")
print("1. 线性回归结果重点关注:")
print("   - P值 (P>|t|): 小于0.05表示显著影响")
print("   - 系数 (coef): 正/负值表示正/负相关")
print("   - R²: 模型解释力 (0~1)")
print("2. 随机森林特征重要性: 数值越大影响越强")
print("3. 热力图: |相关系数| > 0.7 需注意多重共线性")
print("=" * 50)

# 数据分组
temps = [30, 40, 50]
mean_hole_area = [
    np.mean([18.09, 17.04, 19.45, 9.11, 9.40, 8.85, 9.35, 9.40, 9.08]),  # 30℃
    np.mean([30.33, 31.20, 29.20, 24.12, 24.34, 23.11, 36.01, 35.35, 35.66]),  # 40℃
    np.mean([6.41, 6.62, 6.73, 6.41, 6.62, 6.73, 8.38, 8.30, 8.29])  # 50℃
]

# 绘制温度-孔面积关系
plt.figure(figsize=(10, 6))
plt.plot(temps, mean_hole_area, 'o-', markersize=10, linewidth=3)
plt.title("温度对孔面积占比的影响趋势", fontsize=14)
plt.xlabel("温度(℃)", fontsize=12)
plt.ylabel("平均孔面积占比(%)", fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks([30, 40, 50])
plt.annotate('峰值区域', xy=(40, 30), xytext=(38, 32),
             arrowprops=dict(facecolor='red', shrink=0.05))
plt.savefig('temperature_trend.png', dpi=300)
plt.show()

# 添加温度二次项
df['temperature_sq'] = df['temperature']**2
# 添加交互项
df['temp_humidity'] = df['temperature'] * df['humidity']

# 二次回归模型
X_quad = df[['temperature', 'temperature_sq', 'humidity', 'temp_humidity']]
y = df['hole_area']

X_quad_sm = sm.add_constant(X_quad)
quad_model = sm.OLS(y, X_quad_sm).fit()
print(quad_model.summary())
